nodejs模块/文件导出与引入总结:一次搞懂export、export default、module.exports、exports

您所在的位置:网站首页 node 引入一个模块的过程是什么 nodejs模块/文件导出与引入总结:一次搞懂export、export default、module.exports、exports

nodejs模块/文件导出与引入总结:一次搞懂export、export default、module.exports、exports

2024-02-19 07:10| 来源: 网络整理| 查看: 265

太迷了,为避免后面再次忘记或混淆,总结下来一次理清楚这些。

目录

导出方

引入方

总结

module.exports、exports

export、export default

如果想快速看结论,可跳过前面的典型案例!

下面以详细案例举例,下述的文件都在同一目录下。

导出方

导出方1:export.js

// 基于export导出时可以是多个 export let m = 91 export let n = 92

导出方2:export_default.js

// 调用方import sub0  from "./export_default.js" export default function sub0(a, b) {     return a - b; }

导出方3:mod_exports.js

const y0 = 100 // 故意分两部分来导入看看其用法,第一部分以给module.exports直接赋值导出 module.exports = {     y0: y0,     // es6中,导出的名称和原名称一样时,也可以直接y0,无需使用冒号     multiply0: function multiply(a, b) {   // 导出用于计算乘法的函数,导出名称叫multiply0         return a * b     } } // 第二部分以module.exports.xxx导出,给module.exports挂载一个新属性sub // 引入方使用const mod = require("./mod_exports");导入 module.exports.sub  = function (a, b) {     return a - b; }

导出方4:exports.js

const x = 10 const y = 20 function add(a, b) {     return a + b } function Person(name, age) {     this.name = name     this.age = age } // 在一个文件或模块中,export、import可以有多个,export default仅有一个 exports.addFunc = add   // 导出add函数并给出别名addFunc exports.xNum = x   // 导出变量x,别名为xNum exports.y = y       // 导出变量y exports.multiply = function multiply(a, b) {   // 导出用于计算乘法的函数,导出名称叫multiply     return a * b } // 换一种方式,把Person给module.exports挂载上去 // 上述exports.xxx和下面的module.exports.xxx的方式实际一样 module.exports.Person = Person       // 导出Person构造函数 引入方

下面看调用方(模块引入方),共两个文件。

引入方1:call.js  用来验证module.exports和exports

// 注意,加了"type": "module",就不能以require导包了,否则报错ReferenceError: require is not defined in ES module scope, you can use import instead // 本文件在没有"type": "module",配置的条件下执行 const funcs = require("./exports") // const funcs = require("funcs")  // 注意 Error: Cannot find module 'funcs' const xNum = require("./exports").xNum   // 单独导出xNum const multiplyFunc = require("./exports").multiply   // 单独导出乘法匿名函数,并起名叫multiplyFunc // 用funcs来调用,使用基于exports导出的函数、变量等 console.log(funcs.addFunc(1, 2))   // 3 console.log(funcs.addFunc("a", "b"))  // ab console.log(funcs.xNum)  // 10 console.log(xNum - 1)   // 9 console.log(xNum + "x")   // 10x const y = require("./exports").y   // 单独导出y console.log(y + 1)   // 21 console.log(multiplyFunc(5, 5))   // 25 // 用funcs来调用 console.log(funcs.multiply(5, 5))   // 25 const p1 = new funcs.Person("名称", 99) console.log("p1: ", p1)   // Person { name: '名称', age: 99 } console.log("p1.name: ", p1.name)   // 名称 const p2 = new funcs.Person() p2.name = "名称1" p2.age = 99 console.log("p2: ", p2)   // Person { name: '名称1', age: 99 } console.log("p2.name: ", p2.name)   // 名称1 // 使用基于module.exports导出的函数、变量等 const mod = require("./mod_exports"); console.log(mod.y0)   // 100 console.log(mod.sub(20, 5))   // 15  调用以module.exports方式导出的减法函数 console.log(mod.multiply0(20, 5))   // 100  调用以module.exports方式导出的乘法函数

引入方2:call_byimport.js 用来验证export和export default

// 本导入需在有"type": "module",配置的条件下执行 // 引入基于export default导出的函数、变量等 import sub0  from "./export_default.js" console.log(sub0(100, 5))   // 95 // 本导入需在有"type": "module",配置的条件下执行 // 引入基于export导出的函数、变量等 // 注意此时import {m,n}中的m和n必须和export时的一致,如写为{m1,n}会提示SyntaxError: The requested module './export.js' does not provide an export named 'm1' import {m,n} from "./export.js" console.log(m,n)  // 91 92

上述是正常情况下的指向,结果已随行写出,各位看官各细细观察。

重要

以module.exports、exports导出时,如果引入方必须要用import导入,那没辙,会有这个报错:

 SyntaxError: The requested module './mod_exports.js' does not provide an export named 'y0' 

万事不要强求,如下看起来没毛病,但实际不行(加  "type": "module",也一样)

import {y0,sub,multiply0} from "./mod_exports.js" console.log(y0)   //  调用以module.exports方式导出的y0 console.log(sub(20, 5))   //  调用以module.exports方式导出的减法函数 console.log(multiply0(20, 5))   //  调用以module.exports方式导出的乘法函数

此种情况用require就可以了。

总结

这四个操作都可以向(模块)外暴露成员。

前两者export、export default可为一组,是es6的规范,和import匹配,import是es6中的语法标准; 后两者module.exports、exports可为一组,是commonjs的规范,和require匹配,require是amd规范下的引入方式。

当组合不适配时,当然就会报错了。

module.exports、exports

1,从使用方式来看,exports是module的一个属性

2,exports默认指向module.exports对象的引用,不能单独给exports赋值,否则无用(改变了exports的指向),引入方什么也拿不到;可给module.exports赋值,或通过module.exports.xx来挂载新属性xx等。

3,不论是module.exports还是exports,向外共享的最终结果是module.exports所指的对象,这两个没什么区别。

4,基于require引入module.exports、exports导出的成员时,括号里的文件不需要带.js,带上也能运行成功。

export、export default

1,export和export default都可以用于导出常量,函数,模块,文件等,export default是把此命令后面的变量赋值给default这个特殊的系统变量,并把它导出到其余模块中使用,仅导出模块中一个成员时可使用。

2,以export方式导出时,导入时要加{};以export default导出时,导入时不需要{}

3,export可有多个,export default只能有一个,多个export default会提示TS2528: A module cannot have multiple default exports.

4,用export default导出时的名称可以与引入时的名称不同,但export导出必须和import时名称一致;

5,基于import引入export、export default导出的成员时,from后的文件需要带.js后缀。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3